alias this
===========

.. index::
    alias this

Мы рассмотрели отдельные значения ключевых слов alias и this в
предыдущих главах. Эти два ключевых слова имеют совершенно другое значение
когда они используются вместе как alias this.
alias this обеспечивает автоматическое приведение типов (также известное как неявное приведение типов) к определенным пользователем типам.
преобразования) определенных пользователем типов. Как мы уже видели в главе (:ref:`Перегрузка операторов<глава_53_start>`),
другой способ обеспечить преобразование типов для типа - это
определения opCast для этого типа. Разница в том, что если opCast предназначен для явного
преобразования типов, а alias this - для автоматического преобразования типов.
Ключевые слова alias и this пишутся отдельно, когда указывается имя
между ними указывается имя переменной-члена или функции-члена:

.. code-block:: d

    alias member_variable_or_member_function this;

псевдоним, который позволяет выполнить специфическое преобразование из пользовательского типа в
тип этого члена. Значение члена становится результирующим значением
преобразования .
В следующем примере Fraction псевдоним this используется с функцией-членом. Пример
В примере TeachingAssistant, который приведен ниже, он будет использоваться с переменными-членами
переменных.
Поскольку возвращаемый тип функции value() ниже - double, следующий псевдоним this
позволяет автоматически преобразовывать объекты Fraction в double-значения:


.. code-block:: d

    import std.stdio;

    struct Fraction
    {
        long numerator;
        long denominator;
        double value() const
        {
            return double(numerator) / denominator;
        }

        alias value this;
        // ...
    }

    double calculate(double lhs, double rhs)
    {
        return 2 * lhs + rhs;
    }

    void main()
    {
        auto fraction = Fraction(1, 4); // meaning 1/4
        writeln(calculate(fraction, 0.75));
    }

value() вызывается автоматически, чтобы получить double значение, когда объекты Fraction
появляются в местах, где ожидается double значение. Именно поэтому
переменная fraction может быть передана в функцию calculate() в качестве аргумента.
value() возвращает 0,25 в качестве значения 1/4, и программа печатает результат 2 * 0,25 + 0,75

.. code-block:: console

    1.25


